//各种变换矩阵////////////////////////////////////////////////////
UNITY_LIGHTMODEL_AMBIENT //环境光的颜色的强度
                        .xyz//环境光颜色
UNITY_MATRIX_MVP    //当前的模型观察投影矩阵，用于蒋顶点/方向向量 模型空间 => 裁剪空间
UNITY_MATRIX_MV     //当前的模型观察矩阵     顶点/方向向量 模型空间 => 观察空间
UNITY_MATRIX_T_MV   //UNITY_MATRIX_MV 的转置矩阵
UNITY_MATRIX_IT_MV  //UNITY_MATRIX_MV 的逆转置矩阵， 法线 模型空间 => 观察空间，也可以用于得到 UNITY_MATRIX_MV 的逆矩阵
UNITY_MATRIX_V      //当前的观察矩阵      顶点/方向向量 世界空间 => 观察空间
UNITY_MATRIX_P      //当前的投影矩阵      顶点/方向向量 观察空间 => 裁剪空间
UNITY_MATRIX_VP     //当前的投影矩阵      顶点/方向向量 世界空间 => 裁剪空间
_Object2World       //顶点/方向向量 模型空间 => 世界空间
_World2Object       //_Object2World 的逆矩阵， 顶点/方向向量 世界空间 => 模型空间
_LightMatrix0       //世界空间 => 光源空间 的变换矩阵
//默认贴图引用////////////////////////////////////////////////////
_LightTexture0      //光源衰减纹理，通常只需要关系对角上的纹理颜色值
    fixed atten = tex2D(_LightTexture0,dot(lightCoord,lightCoord).rr).UNITY_ATTEN_CHANNEL;  //根据光源空间下物体的位置 lightCoord 来获取衰减值



//语义//////////////////////////////////////////////////
:POSITION //获取模型顶点信息
:NORMAL //获取法线信息
float2/3/4 :TEXCOORD[n] //高精度地从顶点传递信息到片段着色器。后面可以跟一个整数
float4 : COLOR[n] //低精度地从顶点传递信息到片段着色器。后面可以跟一个整数
float4 : TANGENT //获取切线信息
: SV_POSITION //表示已经经过mvp矩阵转化到屏幕坐标系
: SV_TARGET //输出到 Render Target 

//数据类型//////////////////////////////////////////

Properties
{
    _IntNumber("Int Number",Int) = 1
    _MyFloat("Float",float) = 0.5//不加 f
    _Range("Range",Range(0,256)) = 20
    _Color("Color",Color) = (1.0,1.0,1.0,1.0)
    _MainTex("Main Texture",2D) = "white"{}
    _NromalMap("Normal Map",2D) = "bump"{}//Unity 内置的法线纹理，模型自带的纹理信息
    _CubeMap("Cube Map",Cube) = ""{}
    _Tex3D("3D Map",3D) = "defaulttexture"{}//3D纹理，只能通过脚本去创建
    _MyVector("Vertor",Vector) = (1,1,1,1)
    _MyRect("Rect",Rect) = "white"{} //接受图片
}

//////////////////////////////////////////
Pass
{
    Tags { "LightMode" = "ForwordBase" "TagName" = "Value"}//各标签之间用空格隔开
    #include "Lighting.cginc"
    Cull Back|Front|Off
    ZWrite On|Off //深度写入
    ZTest Less|Greater|LEqual|GEqual|Equal|NotEqual|Always //深度测试，默认是 LEqual ，也就是只有深度比他小的才能通过深度测试
    AlphaTest Less|Greater|LEqual|GEqual|Equal|NotEqual|Always|Never [alphaValue] //中括号内为一个数值，可以用变量 可也有不写这句，在偏远着色器中加入 clip(texColor.a - alphaValue);
    Blend
    Fog {
        Mode Off|Global|Linear|Exp|Exp2 //雾的模式
        Color (0.6,0.4,0.3,0.5) //雾的颜色
        Density floatValue  //浓度
        Range floatValue,floatValue //设置线性雾的范围
    }

    sampler2D _MainTex;
    float4 _MainTex_ST;//用于改变纹理的缩放和偏移量
	float4 _MainTex_TexelSize;//用于访问纹理的每个像素的大小。如一张512*512大小的纹理，像素大约为 1/512
 
//内置方法
abs(x)//返回绝对值
max(float f1,float f2);
tex2D(sampler2D texName,float2 uv).rgb;//根据纹理坐标在纹理上取样颜色
cos(float)
frac(float) //返回小数部分，如果参数是多维向量，那么返回一个向量，每一个分量都是对于原分量的小数部分
floor(float)//地板除法，返回值为比参数小的最大整数
float lerp(float a,float b,float w);//线性插值 y = a + (b-a) * w
float clamp(float x,float a,float b);//把 x 限制在 a 到 b 内
#include "UnityCG.cginc"
    saturate(x)//把x截取在[0,1]范围内，如果x是向量，就对x的每一个分量进行操作
    reflect(i,n);//传入入射方向和平面法线方向，返回反射方向。这里的入射方向是指向该点的而不是指向光源，返回反射方向  
    refract(i,n,eta);//传入入射方向和平面法线方向，以及介质透射比，返回折射方向

    float4 UnityObjectToClipPos(float4 vertex);//顶点 模型空间 => 裁剪空间

    float3 WorldSpaceViewDir(float4 v);     //传入 模型空间 顶点坐标，返回 世界空间 v->camera
    float3 UnityWorldSpaceViewDir(float4 v);//传入 世界空间 顶点坐标，返回 世界空间 v->camera
    float3 ObjSpaceViewDir(float4 v);       //传入 模型空间 顶点坐标，返回 模型空间 v->camera

    float3 WorldSpaceLightDir(float4 v);    //<只能用于向前渲染中>传入 模型空间 顶点坐标，返回 世界空间 v->Light 。未归一化
    float3 UnityWorldSpaceLightDir(float 4);//<只能用于向前渲染中>传入 世界空间 顶点坐标，返回 世界空间 v->Light。未归一化
    float3 ObjSpaceLightDir(float4 v);      //<只能用于向前渲染中>传入 模型空间 顶点坐标，返回 模型空间 v->Light。未归一化

    float3 UnityObjectToWorldNormal(float3 normal);//法线 模型空间 => 世界空间
    float3 UnityObjectToWorldDir(float3 dir);//方向向量 模型空间 => 世界空间
    float3 UnityWorldToObjectDir(float3 dir);//方向向量 世界空间 => 模型空间

    TRANSFORM_TEX(tex,name);//内置的宏，传入纹理坐标纹理名，进行纹理的缩放和偏移，宏的实现如下
        #define TRANSFORM_TEX(tex,name){text.xy * name##_ST.xy + name##_ST.zw}  //参见《UnityShader 入门精要》P142

    float4 UnpackNormal(float4 n);  //传入从法线纹理里取样到的像素值，方法内部根据纹理的属性反映射出切线空间下的法线
                                    //如果使用反映射公式 normal=pixel*2-1 的话存在平台差异性的隐患

//内置变量
Tags {"LightMode" = "ForwordBase"}
    _LightColor0.rgb; //光源的颜色
    _WorldSpaceLightPos0.xyz;//光源相对于该点的方向，只能用在只有单一光源并且是平行光的情况下,未归一化
    float4 _Time;   //t是自场景加载开始经过的时间，(t/20,t,2t,3t)
    float4 _SinTime;//t是时间的正弦值，(t/8,t/4,t/2,t)
    float4 _CosTime;//同上
    float4 unity_DeltaTime; //dt是时间增量，(dt,1/dt,smoothDt,1/smoothDt)

//Surface Shader 结构/////////////////////////////////////////////////////////////////////////////////////////////////
//1.没有pass

SubShader{
    Tags { "RenderType"="Opaque" }
	LOD 200

	CGPROGRAM
    #pragma surface surfaceFunction lightModel [optionalparams]
    /*
        surfaceFunction : 入口方法，可定义多种入口方法，包括顶点，surf，灯光，finalColor
    */
    void surf (Input IN, inout SurfaceOutputStandard o) {}
    ENDCG
}

struct SurfaceOutputStandard
{
    fixed3 Albedo;
    fixed3 Normal;
    half3 Emission;
    half Metallic;
    half Smoothness;
    half Occlusion;
    fixed Alpha;
};
struct SurfaceOutputStandardSpecular
{
    fixed3 Albedo;
    fixed3 Normal;
    half3 Emission;
    half Specular;
    half Smoothness;
    half Occlusion;
    fixed Alpha;
};